<?php
/**
 * Created by PhpStorm.
 * User: changshuiwang
 * Date: 2016/7/22
 * Time: 14:38
 */
namespace common\models;

use yii;
use yii\base\Model;

class Common extends Model
{
    //加密解密
    public static function authcode($string, $operation = 'DECODE', $key = 'cms_code', $expiry = 0)
    {
        $ckey_length = 4; // 随机密钥长度 取值 0-32;
        // 加入随机密钥，可以令密文无任何规律，即便是原文和密钥完全相同，加密结果也会每次不同，增大破解难度。
        // 取值越大，密文变动规律越大，密文变化 = 16 的 $ckey_length 次方
        // 当此值为 0 时，则不产生随机密钥
        $key = md5($key ? $key : UC_KEY);
        $keya = md5(substr($key, 0, 16));
        $keyb = md5(substr($key, 16, 16));
        $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), - $ckey_length)) : '';

        $cryptkey = $keya . md5($keya . $keyc);
        $key_length = strlen($cryptkey);

        $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
        $string_length = strlen($string);

        $result = '';
        $box = range(0, 255);

        $rndkey = array();
        for ($i = 0; $i <= 255; $i ++) {
            $rndkey[$i] = ord($cryptkey[$i % $key_length]);
        }
        for ($j = $i = 0; $i < 256; $i ++) {
            $j = ($j + $box[$i] + $rndkey[$i]) % 256;
            $tmp = $box[$i];
            $box[$i] = $box[$j];
            $box[$j] = $tmp;
        }

        for ($a = $j = $i = 0; $i < $string_length; $i ++) {
            $a = ($a + 1) % 256;
            $j = ($j + $box[$a]) % 256;
            $tmp = $box[$a];
            $box[$a] = $box[$j];
            $box[$j] = $tmp;
            $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
        }

        if ($operation == 'DECODE') {
            if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
                return substr($result, 26);
            } else {
                return '';
            }
        } else {
            return $keyc . str_replace('=', '', base64_encode($result));
        }
    }

    public static function createImg($width=80,$height=40,$w=80,$h=40)
    {
        $str=self::createRandomStr(4);

        //创建一个图层
        $im = imagecreate($width, $height);

        //背景色
        $back = imagecolorallocate($im, 0xCC, 0xCC, 0xCC);

        //模糊点颜色
        $pix  = imagecolorallocate($im, 187, 230, 247);

        //字体色
        $font = imagecolorallocate($im, 41, 163, 238);

        //模糊线颜色
        $line  = imagecolorallocate($im, 0x4D, 0x4D, 0x4D);

        $fonturl='/fonts/Meera.ttf';

        $style = array ($back,$back,$back,$back,$back,
            $line,$line,$line,$line,$line
        );
        imagesetstyle($im, $style);

        $y1 = rand(0, $h);
        $y2 = rand(0, $h);
        $y3 = rand(0, $h);
        $y4 = rand(0, $h);
        imageline($im, 0, $y1, $w, $y3, IMG_COLOR_STYLED);
        imageline($im, 0, $y2, $w, $y4, IMG_COLOR_STYLED);

        //绘模糊作用的点
        //mt_srand();
        for ($i = 0; $i < 1000; $i++) {
            imagesetpixel($im, mt_rand(0, $width), mt_rand(0, $height), $pix);
        }

        //输出字符
        for($i=0,$j=5;$i<4;$i++){
            $array = array(-1,1);
            $p = array_rand($array);
            $an = $array[$p]*mt_rand(1,20); //扭曲角度
            $size = 30;//字体大小
            imagettftext($im,$size,$an,$j,rand(20,30),$font,$fonturl,$str[$i]);
            $j+=20;
        }
        //imagestring($im, 5, 0, 0, $str, $font);

        //输出矩形
        imagerectangle($im, 0, 0, $width -1, $height -1, $font);

        //输出图片

        $str=self::authcode($str,'CODE');
        
        setcookie('validateCode',$str,time()+300,'/');

        imagepng($im);
        imagedestroy($im);
    }

    private static function createRandomStr($length)
    {
        $str="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        $result="";
        for($i=0;$i<$length;$i++){
            $result.=$str[mt_rand(0,strlen($str))];
        }
        return $result;
    }
}